
package persistencia;

import dominio.*;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;


public class PersistenciaCliente {

//    private List<Cliente> clientes = new ArrayList<Cliente>();
        private static PersistenciaCliente Instanciacliente;
        private Connection conn;
        

 //Conexão com o banco de dados
    private PersistenciaCliente () {
                Conecta c = Conecta.getConnection();
                this.conn = c.conn;
    }
 
 // Singleton. Usado para que haja apenas uma conexão com o banco sendo usada no sistema

   public static PersistenciaCliente getInstance(){
	if(Instanciacliente == null) {
                        	Instanciacliente = new PersistenciaCliente();
	    }
	 return Instanciacliente;
   }     
   /*
* Função que consulta o cliente pelo nome
* retornando todos os atributos do cliente
* @param cliente só com nome
* @return cliente com todos os atributos
*/
  public Cliente consultarNome(Cliente cliente){
        Statement statement;
        ResultSet result;
        try {
            statement = conn.createStatement();
            result = statement.executeQuery("SELECT * FROM Cliente WHERE nome = "+"'"+cliente.getNome()+"'");
            if (result.next()){
                        Cliente c = new Cliente(
                        result.getString("nome"), result.getString("cpf"), result.getString("endereco"), result.getString("telefone"));
                        return c;
            }
            else return null;
        } catch (SQLException ex) {
            System.out.println("Erro em consulta cliente por nome.");
            //Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
           return null;
        }
    }

/*
* Função que consulta o cliente pelo cpf
* retornando todos os atributos do cliente
* @param cliente só com cpf
* @return cliente com todos os atributos
*/
    public Cliente consultarClientePorCpf(Cliente cliente){
        Statement statement;
        ResultSet result;
        try {
            statement = conn.createStatement();
            result = statement.executeQuery("SELECT * FROM Cliente WHERE cpf = "+"'"+cliente.getCpf()+"'");
            if (result.next()){
                Cliente c = new Cliente(
                        result.getString("nome"), result.getString("cpf"), result.getString("endereco"), result.getString("telefone"));
                        return c;
            }
            else return null;
        } catch (SQLException ex) {
            System.out.println("Erro em consulta cliente por cpf.");
            //Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
           return null;
        }
    }

/* Função que cadastra um cliente no banco de dados
* @param nome
* @param cpf
* @param endereco
* @param telefone
* @return cliente
*/
    public void cadastroCliente(String nome, String cpf, String endereco, String telefone ) {
           
            Statement statement;
/*
            System.out.println("Digite o nome do Cliente: ");
            nome = Console.readString();
            System.out.println("Digite o cpf do Cliente:");
            cpf = Console.readString();
            System.out.println("Digite o endereco do Cliente: ");
            endereco = Console.readString();
            System.out.println("Digite o telefone do Cliente:");
            telefone = Console.readString();
  */
            Cliente c = new Cliente(nome, cpf, endereco, telefone);
                if (consultarClientePorCpf(c) == null){
                    try {
                            statement = conn.createStatement();
                            statement.executeUpdate("INSERT INTO Cliente (cpf,nome,endereco,telefone) " +
                                            "values('"+cpf+"','"+nome+"','"+endereco+"','"+telefone+"')");
                    } catch (SQLException e) {
                        System.out.println("Erro em cadastro de cliente.");
                            //imprime erro
                    }
                    System.out.println("Cliente cadastrado com sucesso!");
               }
                else {
                    System.out.println("Cliente já estava cadastrado");
                }
        }

/* Função que altera um cadastro de um cliente
* @param cpf
*/
 
     public void alteraCadastroCliente(String cpf){
         String endereco;
         String telefone;
         Statement statement;
         
            Cliente c = new Cliente(null, cpf);
            if (consultarClientePorCpf(c) != null){                      
                    try {
                            System.out.println("Digite o endereco do Cliente: ");
                            endereco = Console.readString();
                            System.out.println("Digite o telefone do Cliente:");
                            telefone = Console.readString();
                            statement = conn.createStatement();
                            statement.executeUpdate("UPDATE Cliente SET endereco =  '"+endereco+"' WHERE cpf='"+cpf+"'");
                            statement.executeUpdate("UPDATE Cliente SET telefone =  '"+telefone+"' WHERE cpf='"+cpf+"'");
                    } catch (SQLException e) {
                        System.out.println("Erro em alterar cliente.");
                     //imprime erro
                    }
                    System.out.println("Cadastro do cliente alterado com sucesso!");
               }
         else {
                    System.out.println("Cliente não existe. Cadastre-o primeiro");
          }
    }

/* Função que cria lista todos os clientes
* presentes no banco
* @retun listaClientes
*/
     public ArrayList<Cliente> listarClientes () {
                ArrayList<Cliente> clientes = new ArrayList<Cliente>();
                Statement statement;
                ResultSet result;
                try {
                        statement = conn.createStatement();
                        result = statement.executeQuery("SELECT * FROM Cliente");
                        while (result.next()){
                                Cliente c = new Cliente(result.getString("nome"), result.getString("cpf"), result.getString("endereco"),result.getString("telefone"));
                                clientes.add(c);  
                        }
                        return clientes;
                } catch (SQLException e) {
                    System.out.println("Erro em listar clientes.");
                        //Log.getLoginstance(null).error("Ocorreu um erro: "+e.getMessage());
                        return null;
                }
        }

/* Função que imprime uma lista de clientes
* @param listaClientes
*/
    
   public void imprimeLista(ArrayList<Cliente> clientes) {

       for (int i=0; i < clientes.size(); i++) {
           System.out.println(i);
           System.out.println("Nome: "+ clientes.get(i).getNome());
           System.out.println("CPF: "+ clientes.get(i).getCpf());
           System.out.println("Endereco: "+ clientes.get(i).getEndereco());
           System.out.println("Telefone: "+ clientes.get(i).getTelefone());
           System.out.println();
       }
   }
}
